package pt.isel.lercm.projectmanager.managedController.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import pt.isel.lercm.projectmanager.auxobjects.Mode;
import pt.isel.lercm.projectmanager.managedController.generic.GenericManagedBeanEntity;
import pt.isel.lercm.projectmanager.spring.model.Aluno;
import pt.isel.lercm.projectmanager.spring.model.AnoLectivo;
import pt.isel.lercm.projectmanager.spring.model.Grupo;
import pt.isel.lercm.projectmanager.spring.service.IAlunoService;
import pt.isel.lercm.projectmanager.spring.service.IAnoLectivoService;
import pt.isel.lercm.projectmanager.spring.service.IConstanteService;
import pt.isel.lercm.projectmanager.spring.service.IGrupoService;

@ManagedBean(name = "alunosBean")
@ViewScoped
public class AlunosBean extends GenericManagedBeanEntity<Aluno> implements Serializable{

	private static final long serialVersionUID = 6773520847108740043L;

	@ManagedProperty(value="#{AlunoService}")
	private IAlunoService alunoService;
	
	@ManagedProperty(value="#{GrupoService}")
	private IGrupoService grupoService;
	
	@ManagedProperty(value="#{ConstanteService}")
	private IConstanteService constanteService;
	
	@ManagedProperty(value="#{AnoLectivoService}")
	private IAnoLectivoService anoLectivoService;
	
	private List<Aluno> alunos;
	
	private Aluno novoAluno;
	
	private List<Grupo> listaGrupos;
	
	private String idGrupo;
	
	@Override
	public void init() {
		if (alunos == null){
			if (alunoService.getAllByYear(Integer.parseInt(constanteService.getValorByName("ANO_ACTUAL"))) != null) {
				alunos = new ArrayList<Aluno>(alunoService.getAllByYear(Integer.parseInt(constanteService.getValorByName("ANO_ACTUAL"))));
			}
			else{
				alunos = new ArrayList<Aluno>();
			}
		}
		
		if (getMode() == null){
			setMode(Mode.LEITURA.mode);
		}
		
		if(novoAluno == null){
			novoAluno = new Aluno();
		}
		
	}
	
	@Override
	public void gravarNovo() {
		if (novoAluno != null){
			
			if(idGrupo != null){
				novoAluno.setGrupo(grupoService.getById(Integer.parseInt(idGrupo)));
				idGrupo = null;
			}
			
			AnoLectivo aux = anoLectivoService.getById(Integer.parseInt(constanteService.getValorByName("ANO_ACTUAL")));
			
			novoAluno.setAnoLectivo(aux);
			
			alunoService.add(novoAluno);
			
			alunos.add(novoAluno);
			
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Aluno criado com sucesso!", ""));
		}
	}

	@Override
	public void gravarEditar() {
		
		if (alunos != null){
			for (Aluno a : alunos){
				alunoService.update(a);
			}
			
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alunos actualizados com sucesso!", ""));
		}
		
	}

	public void novo(){
		novoAluno = new Aluno();
	}

	public void apagar(Aluno object) {
		alunos.remove(object);
		
		alunoService.delete(object);
		
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "O aluno foi apagado com sucesso!", ""));
	}
	
	public IAlunoService getAlunoService() {
		return alunoService;
	}

	public void setAlunoService(IAlunoService alunoService) {
		this.alunoService = alunoService;
	}

	public IGrupoService getGrupoService() {
		return grupoService;
	}

	public void setGrupoService(IGrupoService grupoService) {
		this.grupoService = grupoService;
	}

	public IConstanteService getConstanteService() {
		return constanteService;
	}

	public void setConstanteService(IConstanteService constanteService) {
		this.constanteService = constanteService;
	}

	public IAnoLectivoService getAnoLectivoService() {
		return anoLectivoService;
	}

	public void setAnoLectivoService(IAnoLectivoService anoLectivoService) {
		this.anoLectivoService = anoLectivoService;
	}

	public List<Aluno> getAlunos() {
		return alunos;
	}

	public void setAlunos(List<Aluno> alunos) {
		this.alunos = alunos;
	}

	public Aluno getNovoAluno() {
		return novoAluno;
	}

	public void setNovoAluno(Aluno novoAluno) {
		this.novoAluno = novoAluno;
	}

	public List<Grupo> getListaGrupos() {
		
		if (listaGrupos == null){
			listaGrupos = grupoService.getAll();
		}
		
		return listaGrupos;
	}

	public void setListaGrupos(List<Grupo> listaGrupos) {
		this.listaGrupos = listaGrupos;
	}

	public String getIdGrupo() {
		return idGrupo;
	}

	public void setIdGrupo(String idGrupo) {
		this.idGrupo = idGrupo;
	}
}
